#ifndef __LOG_H__
#define __LOG_H__
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
#include <pthread.h>

// 日志的等级
typedef enum
{
    LOG_LEVEL_DEBUG = 0, // 调试信息
    LOG_LEVEL_INFO,      // 普通信息
    LOG_LEVEL_WARN,      // 警告信息
    LOG_LEVEL_ERROR,     // 错误信息
    LOG_LEVEL_FATAL      // 致命错误信息
} log_level_t;

/**
 * @brief 日志初始化
 *
 * @param log_file 日志文件路径
 * @param level 日志的等级，低于这个等级的日志才会被记录
 * @return 日志初始化是否成功 0-成功，-1-失败
 */
int log_init(const char *log_file, log_level_t level);

/**
 * @brief 关闭日志文件
 *
 */
void log_close(void);

/**
 * @brief 先日志中写入一条日志
 *
 * @param level 这次写入的日志的等级
 * @param file 写入日志时所在的文件
 * @param func 写入日志时所在的函数
 * @param line 写入日志时所在的行号
 * @param fmt  写入日志的格式化字符串
 * @param ...  写入日志的可变参数
 */
void log_write(log_level_t level, const char *file, const char *func, int line, const char *fmt, ...);

// 封装的宏
#define LOG_DEBUG(fmt, ...) log_write(LOG_LEVEL_DEBUG, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_INFO(fmt, ...) log_write(LOG_LEVEL_INFO, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_WARN(fmt, ...) log_write(LOG_LEVEL_WARN, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_ERROR(fmt, ...) log_write(LOG_LEVEL_ERROR, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)
#define LOG_FATAL(fmt, ...) log_write(LOG_LEVEL_FATAL, __FILE__, __func__, __LINE__, fmt, ##__VA_ARGS__)

#endif // __LOG_H__